home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / dkbuts.zip / TGA2DUMP.C < prev    next >
C/C++ Source or Header  |  1991-05-16  |  5KB  |  183 lines

  1. /***************************************************************
  2.  
  3. TGA2DUMP.C  - Converts a Targa-16/24/32 file to a DKB/QRT "Dump"
  4.           format raw file.
  5.  
  6.           Version 1.1 By Aaron A. Collins, written on 1/1/91
  7.           Version 1.2 By Aaron A. Collins, revised on 5/1/91
  8.           Version 1.3 By Aaron A. Collins, revised on 5/15/91
  9.  
  10.           This file is released to the Public Domain.
  11.  
  12.  **************************************************************/
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #ifndef TRUE
  19. #define TRUE 1
  20. #define FALSE 0
  21. #endif
  22.  
  23. #define MAXXRES 2048   /* huge max x resolution allowable, infinite y res. */
  24.  
  25. write_line(int, FILE *, int);
  26.  
  27. unsigned char linbuf[MAXXRES * 3];
  28.  
  29. void main(argc,argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.     register int xres, yres, xhi, yhi;
  34.     register int y, pixelsize, filetype;
  35.     FILE *in, *out;
  36.  
  37.     printf("\n\nTarga-16/24/32 Image File to DKB/QRT Dump Format Converter\n");
  38.     printf("Version 1.3  By Aaron A. Collins.  Written 1/1/91 Revised 5/15/91\n\n");
  39.  
  40.     if (argc != 3)
  41.     {
  42.         printf("Usage: %s InputFile OutputFile\n\n",argv[0]);
  43.         exit(1);
  44.     }
  45.  
  46.     if ((in = fopen(argv[1], "rb")) == NULL)  /* try opening input file */
  47.     {
  48.         printf("ERROR - Couldn't open file %s\n", argv[1]);
  49.         exit(1);
  50.     }
  51.     
  52.     if ((out = fopen(argv[2], "wb")) == NULL)
  53.     {
  54.         printf("ERROR - Couldn't create file %s\n", argv[2]);
  55.         fclose(in);
  56.         exit(1);
  57.     }
  58.  
  59.     /** absorb 1st part of Targa header **/
  60.  
  61.     fgetc(in);        /* absorb 2 0's */
  62.     fgetc(in);
  63.  
  64.     if ((filetype = fgetc(in)) != 2) /* Uncompressed, Unmapped TGA only */
  65.     {
  66.         printf("\nInvalid Targa File Type %d (Must be 2) - Aborting!\n\n", filetype);
  67.         fclose(in);             /* close all files */
  68.         fclose(out);
  69.         unlink(argv[2]);
  70.         exit(1);
  71.     }
  72.  
  73.     for (y = 0; y < 9; y++)    /* discard 7 0's and file X/Y origin */
  74.         fgetc(in);
  75.  
  76.     /** load x and y resolution from input Targa file while copying **/
  77.  
  78.     xres = fputc(fgetc(in), out);    /* lo order */
  79.     xhi = fputc(fgetc(in), out);    /* hi order */
  80.     xres += ((unsigned int) xhi) << 8;
  81.  
  82.     if (xres > MAXXRES)            /* too big? */
  83.     {
  84.         printf("ERROR - X res. of %s (%d) exceeds maximum (%d)!\n", argv[1], xres, MAXXRES);
  85.         fclose(in);            /* close all files */
  86.         fclose(out);
  87.         unlink(argv[2]);        /* delete empty out files */
  88.         exit(1);
  89.     }
  90.  
  91.     yres = fputc(fgetc(in), out);        /* now do yres the same... */
  92.     yhi = fputc(fgetc(in), out);
  93.     yres += ((unsigned int) yhi) << 8;
  94.  
  95.     pixelsize = fgetc(in);    /* discard bits/pixel and display order */
  96.     fgetc(in);        /* assume top-down display order */
  97.  
  98.     if (pixelsize != 16 && pixelsize != 24 && pixelsize != 32)
  99.     {
  100.         printf("\nInvalid Targa File Pixel Size %d (must be 16,24,32) - Aborting!\n\n", pixelsize);
  101.         fclose(in);             /* close all files */
  102.         fclose(out);
  103.         unlink(argv[2]);
  104.         exit(1);
  105.     }
  106.  
  107.     printf("Input file         = %s\n", argv[1]);    /* show stats */
  108.     printf("Bits per pixel     = %d\n", pixelsize);
  109.     printf("Output file        = %s\n", argv[2]);
  110.     printf("Image X resolution = %d\n", xres);
  111.     printf("Image Y resolution = %d\n", yres);
  112.  
  113.     printf("\nProcessing Line:   0");
  114.  
  115.     for (y = 0; y < yres; y++)    /* for every line in the in file */
  116.     {
  117.         printf("\b\b\b%3d", y);        /* disp. current line # */
  118.  
  119.         if (feof(in))            /* stop if file truncated */
  120.             break;
  121.  
  122.         fread(linbuf, 1, xres * (pixelsize/8), in); /* read a line */
  123.  
  124.         fputc(y & 0x00ff, out);        /* write line # out */
  125.         fputc((y & 0xff00) >> 8, out);
  126.  
  127.         if (write_line(xres, out, pixelsize))
  128.         {
  129.             printf("File output error on %s.  Disk Full?\n", argv[2]);
  130.             fclose(in);
  131.             fflush(out);
  132.             fclose(out);
  133.             exit(1);
  134.         }
  135.     }
  136.     printf("\n");
  137.     fclose(in);                                 /* close all files */
  138.     fflush(out);
  139.     fclose(out);
  140.     exit(0);
  141. }
  142.  
  143. write_line(xres, out, pixelsize)
  144. int xres, pixelsize;
  145. FILE *out;
  146. {
  147.     register int idx, x;
  148.     register unsigned int tmp_byte;
  149.  
  150.     switch (pixelsize)    /* Pixel ordering for Targa-16/24/32 files */
  151.     {
  152.         case 16:
  153.         for (x = 0, idx = 1; x < xres; x++, idx += 2)
  154.             fputc((linbuf[idx] & 0x7C) << 1, out);  /* write Red */
  155.         for (x = 0, idx = 0; x < xres; x++, idx += 2)
  156.         {
  157.             tmp_byte = (linbuf[idx] & 0xE0) >> 2;
  158.             tmp_byte |= (linbuf[idx + 1] & 0x03) << 6;
  159.             fputc(tmp_byte, out);  /* write line of Green */
  160.         }
  161.         for (x = 0, idx = 0; x < xres; x++, idx += 2)
  162.             fputc((linbuf[idx] & 0x1F) << 3, out);  /* write Blue */
  163.         break;
  164.         case 24:
  165.         for (x = 0, idx = 2; x < xres; x++, idx += 3)
  166.             fputc(linbuf[idx], out);  /* write line of Red */
  167.         for (x = 0, idx = 1; x < xres; x++, idx += 3)
  168.             fputc(linbuf[idx], out);  /* write line of Green */
  169.         for (x = 0, idx = 0; x < xres; x++, idx += 3)
  170.             fputc(linbuf[idx], out);  /* write line of Blue */
  171.         break;
  172.         case 32:
  173.         for (x = 0, idx = 2; x < xres; x++, idx += 4)
  174.             fputc(linbuf[idx], out);  /* write line of Red */
  175.         for (x = 0, idx = 1; x < xres; x++, idx += 4)
  176.             fputc(linbuf[idx], out);  /* write line of Green */
  177.         for (x = 0, idx = 0; x < xres; x++, idx += 4)
  178.             fputc(linbuf[idx], out);  /* write line of Blue */
  179.         break;
  180.     }
  181.     return(ferror(out));
  182. }
  183.